#ifndef TRAJECTORY_H
#define TRAJECTORY_H

#include <vector>
#include <string>
#include <cstdint>
#include <QVector3D>

// ###########################################################################
// 轨迹点结构体（轨迹的单个目标点）
// ###########################################################################
struct TrajectoryPoint {
    double timestamp;        // 时间戳（相对于轨迹开始的时间，单位：s）
    QVector3D position;      // 位置（X/Y/Z，单位：mm）
    QVector3D velocity;      // 速度（X/Y/Z方向，单位：mm/s）
    QVector3D acceleration; // 加速度（X/Y/Z方向，单位：mm/s²）
    double jerk;            // 加加速度（平滑控制，单位：mm/s³）
    uint8_t blend_type;      // 过渡类型：0x00=无过渡，0x01=线性过渡，0x02=圆弧过渡
};

// ###########################################################################
// 轨迹结构体（完整的轨迹规划数据）
// ###########################################################################
struct Trajectory {
    uint32_t trajectory_id;  // 轨迹ID（唯一标识）
    std::string name;        // 轨迹名称（如"拾取轨迹1"）
    double total_time;       // 轨迹总时长（单位：s）
    double max_velocity;     // 轨迹最大速度（单位：mm/s）
    double max_acceleration; // 轨迹最大加速度（单位：mm/s²）
    std::vector<TrajectoryPoint> points; // 轨迹点列表
    uint8_t status;          // 轨迹状态：0x00=未加载，0x01=已加载，0x02=执行中，0x03=已完成
    uint64_t create_time;     // 创建时间（ms时间戳）
};

// ###########################################################################
// 轨迹操作请求结构体（客户端→服务器的轨迹相关指令）
// ###########################################################################
struct TrajectoryRequest {
    uint8_t op_type;         // 操作类型：0x00=加载轨迹，0x01=删除轨迹，0x02=修改轨迹，0x03=查询轨迹
    uint32_t trajectory_id;  // 目标轨迹ID
    Trajectory trajectory;   // 轨迹数据（仅op_type=0x00/0x02时有效）
    uint32_t client_id;      // 请求客户端ID
};

#endif // TRAJECTORY_H